home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / asm / XZN-BBStro_src.lha / BBS / Startup2.S < prev   
Text File  |  1996-08-26  |  19KB  |  592 lines

  1. ******************************************************************************
  2. ;    680X0 & AGA STARTUP BY FABIO CIUCCI - Livello di complessita' 2
  3. ******************************************************************************
  4.  
  5. MAINCODE:
  6.     movem.l    d0-d7/a0-a6,-(SP)    ; Salva i registri nello stack
  7.     move.l    4.w,a6            ; ExecBase in a6
  8.     LEA    DosName(PC),A1        ; Dos.library
  9.     JSR    -$198(A6)        ; OldOpenlib
  10.     MOVE.L    D0,DosBase
  11.     BEQ.w    EXIT3            ; Se zero, esci! Errore!
  12.     LEA    GfxName(PC),A1        ; Nome libreria da aprire
  13.     JSR    -$198(A6)        ; OldOpenLibrary - apri la lib
  14.     MOVE.L    d0,GfxBase
  15.     BEQ.w    EXIT2            ; Se si, esci! Errore!
  16.     LEA    IntuiName(PC),A1    ; Intuition.library
  17.     JSR    -$198(A6)        ; OldOpenlib
  18.     MOVE.L    D0,IntuiBase
  19.     BEQ.w    EXIT1            ; Se zero, esci! Errore!
  20.  
  21.     MOVE.L    d0,A0
  22.     CMP.W    #39,$14(A0)      ; Versione 39 o maggiore? (kick3.0+)
  23.     BLT.s    VecchiaIntui
  24.     BSR.w    ResettaSpritesV39 ; se kick3.0+ allora resetta sprites
  25. VecchiaIntui:
  26.  
  27. ; Salviamo il color0
  28.  
  29.     MOVE.L    IntuiBase(PC),A6
  30.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  31.     LEA    $2c(A0),A0    ;  vp  =  A pointer to a ViewPort structure.
  32.     move.l    a0,VPfirstScreen
  33.     move.l    4(a0),a0    ;  colormap = la colormap di questo viewport
  34.     MOVEQ    #0,D0        ; entry - vogliamo avere il color0! (sfondo)
  35.     MOVE.L    GfxBase(PC),A6
  36.     JSR    -$246(A6)    ; GetRGB4 - prendi il valore del color0
  37.                 ; dalla ColorMap dello schermo (-1 se error!)
  38.     move.w    d0,SavedColor0
  39.  
  40. ; E anneriamolo!
  41.  
  42.     move.l    VPfirstScreen(PC),a0
  43.     LEA    colore0(PC),A1    ; colore $0RGB
  44.     MOVEQ    #1,D0        ; count - solo il colore di sfondo da cambiare
  45.     JSR    -$C0(A6)    ; LoadRGB4
  46.  
  47. ; Resettiamo lo schermo (con colore di sfondo annerito!)
  48.  
  49.     MOVE.L    $22(A6),WBVIEW    ; Salva il WBView attuale di sistema
  50.     SUB.L    A1,A1        ; View nullo per azzerare il modo video
  51.     JSR    -$DE(A6)    ; LoadView nullo - modo video azzerato
  52.     SUB.L    A1,A1        ; View nullo
  53.     JSR    -$DE(A6)    ; LoadView (due volte per sicurezza...)
  54.     JSR    -$10E(A6)    ; WaitOf ( Queste due chiamate a WaitOf    )
  55.     JSR    -$10E(A6)    ; WaitOf ( servono a resettare l'interlace )
  56.     JSR    -$10E(A6)    ; Altre due, vah!
  57.     JSR    -$10E(A6)
  58.  
  59.     bsr.w    InputOff    ; Disabilita l'input di intuition (ossia non
  60.                 ; legge piu' il mouse e la tastiera)
  61.  
  62.     MOVE.L    4.w,A6
  63.     SUB.L    A1,A1        ; NULL task - trova questo task
  64.     JSR    -$126(A6)    ; findtask (Task(name) in a1, -> d0=task)
  65.     MOVE.L    D0,A1        ; Task in a1
  66.     move.l    d0,ThisTask
  67.     MOVE.L    $B8(A1),pr_Win    ; A questo offset è presente l' address
  68.                 ; della window dalla quale è stato
  69.                 ; caricato il programma e che serve al
  70.                 ; DOS per sapere dove aprire i Reqs.
  71.     MOVE.L    #-1,$B8(A1)    ; Settandolo a -1 il DOS non apre Reqs
  72.                 ; Infatti se ci fossero errori nell'apertura
  73.                 ; di files con la dos.lib, il sistema
  74.                 ; proverebbe ad aprire un requester, ma con
  75.                 ; il blitter disabilitato (OwnBlit), non lo
  76.                 ; potrebbe disegnare, bloccando tutto!
  77.     MOVEQ    #-1,D0        ; Priorita' in d0 (-128, +127) - in attesa
  78.     JSR    -$12C(A6)    ; LVOSetTaskPri (d0=priorita', a1=task)
  79.  
  80.     LEA    $DFF006,A5    ; VhPosr
  81.     lea    $bfe001,a4
  82.     moveq    #6,d2
  83.     MOVE.w    #$dd,D0        ; Linea da attendere
  84.     MOVE.w    #WaitDisk,D1    ; Quanto attendere... (Per essere sicuri che
  85. WaitaLoop:            ; disk drives o Hard Disk abbiano finito).
  86.     btst.b    d2,(a4)        ; btst #6,$bfe001 -> aspetta il left mouse
  87.     beq.s    SkippaWait
  88.     CMP.B    (A5),D0
  89.     BNE.S    WaitaLoop
  90. Wait2:
  91.     CMP.B    (A5),D0
  92.     Beq.s    Wait2
  93.     dbra    D1,WaitaLoop
  94. SkippaWait:
  95.     btst.b    d2,(a4)        ; btst #6,$bfe001 -> lasciamo il left mouse!
  96.     beq.s    SkippaWait
  97.  
  98.  
  99.     MOVE.L    4.w,A6
  100.     move.l    thistask(PC),a1    ; Task in a1
  101.     MOVEQ    #127,D0        ; Priorita' in d0 (-128, +127) - MASSIMA!
  102.     JSR    -$12C(A6)    ; LVOSetTaskPri (d0=priorita', a1=task)
  103.  
  104.     MOVE.L    GfxBase(PC),A6
  105.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  106.                 ; impedendone l'uso al sistema operativo.
  107.     jsr    -$E4(A6)    ; WaitBlit - Attende la fine di ogni blittata
  108.     JSR    -$E4(A6)    ; WaitBlit
  109.  
  110.     move.l    4.w,a6        ; ExecBase in A6
  111.     JSR    -$84(a6)    ; FORBID - Disabilita il Multitasking
  112.     JSR    -$78(A6)    ; DISABLE - Disabilita anche gli interrupt
  113.                 ;        del sistema operativo
  114.  
  115.     bsr.w    HEAVYINIT    ; Ora puoi eseguire la parte che opera
  116.                 ; sui registri hardware
  117.  
  118.     move.l    4.w,a6        ; ExecBase in A6
  119.     JSR    -$7E(A6)    ; ENABLE - Abilita System Interrupts
  120.     JSR    -$8A(A6)    ; PERMIT - Abilita il multitasking
  121.  
  122.     move.l    thistask(PC),a1    ; Task in a1
  123.     MOVE.L    pr_Win(PC),$B8(A1) ; ripristina l'address della window
  124.     MOVEQ    #0,D0           ; Priorita' in d0 (-128, +127) - NORMALE
  125.     JSR    -$12C(A6)       ; LVOSetTaskPri (d0=priorita', a1=task)
  126.  
  127.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  128.     jsr    -$E4(A6)    ; Aspetta la fine di eventuali blittate
  129.     JSR    -$E4(A6)    ; WaitBlit
  130.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  131.                 ; puo' nuovamente usare il blitter
  132.  
  133.     MOVE.L    IntuiBase(PC),A0
  134.     CMP.W    #39,$14(A0)    ; V39+?
  135.     BLT.s    Vecchissima
  136.     BSR.w    RimettiSprites
  137. Vecchissima:
  138.  
  139. ; RiPristina il Color0
  140.  
  141.     MOVE.L    GfxBase(PC),A6    ; GfxBase in A6
  142.     move.l    VPfirstScreen(PC),a0
  143.     LEA    Savedcolor0(PC),A1 ; colore0 originale
  144.     MOVEQ    #1,D0        ; count - solo il colore di sfondo da cambiare
  145.     MOVE.L    GfxBase(PC),A6
  146.     JSR    -$C0(a6)    ; LoadRGB4 - vecchio color0
  147.  
  148.     MOVE.L    WBVIEW(PC),A1    ; Vecchio WBVIEW in A1
  149.     JSR    -$DE(A6)    ; loadview - rimetti il vecchio View
  150.     JSR    -$10E(A6)    ; WaitOf ( Risistema l'eventuale interlace)
  151.     JSR    -$10E(A6)    ; WaitOf
  152.     MOVE.W    #$11,$DFF10C    ; Questo non lo ripristina da solo..!
  153.     MOVE.L    $26(a6),$dff080    ; COP1LC - Punta la vecchia copper1 di sistema
  154.     MOVE.L    $32(a6),$dff084    ; COP2LC - Punta la vecchia copper2 di sistema
  155.     move.w    d0,$dff088
  156.  
  157.     bsr.w    InputOn        ; Rispristina l'input di intuition
  158.  
  159.     MOVE.L    IntuiBase(PC),A6
  160.     JSR    -$186(A6)    ; _LVORethinkDisplay - Ridisegna tutto il
  161.                 ; display, comprese ViewPorts e eventuali
  162.                 ; modi interlace o multisync.
  163.     MOVE.L    A6,A1        ; IntuiBase in a1 per chiudere la libreria
  164.     move.l    4.w,a6        ; ExecBase in A6
  165.     jsr    -$19E(a6)    ; CloseLibrary - intuition.library CHIUSA
  166. EXIT1:
  167.     MOVE.L    GfxBase(PC),A1    ; GfxBase in A1 per chiudere la libreria
  168.     jsr    -$19E(a6)    ; CloseLibrary - graphics.library CHIUSA
  169. EXIT2:
  170.     MOVE.L    DosBase(PC),A1    ; DosBase in A1 per chiudere la libreria
  171.     jsr    -$19E(a6)    ; CloseLibrary - dos.library CHIUSA
  172. EXIT3:
  173.     movem.l    (SP)+,d0-d7/a0-a6 ; Riprendi i vecchi valori dei registri
  174.     RTS              ; Torna all'ASMONE o al Dos/WorkBench
  175.  
  176. pr_Win:
  177.     dc.l    0
  178. colore0:
  179.     dc.w    0
  180. SavedColor0:
  181.     dc.w    0
  182. VPfirstScreen:
  183.     dc.l    0
  184. ThisTask:
  185.     dc.l    0
  186. *******************************************************************************
  187. ;    Resetta la risoluzione degli sprite "legalmente"
  188. *******************************************************************************
  189.  
  190. ResettaSpritesV39:
  191.     MOVE.L    IntuiBase(PC),A6
  192.     LEA    Workbench(PC),A0 ; Nome schermo del Workbench (per lock) in a0
  193.     JSR    -$1FE(A6)    ; _LVOLockPubScreen - "blocchiamo" lo schermo
  194.                 ; (il cui nome e' in a0).
  195.     MOVE.L    D0,SchermoWBLocckato
  196.     BEQ.s    ErroreSchermo
  197.     MOVE.L    D0,A0        ; Struttura Screen in a0
  198.     MOVE.L    $30(A0),A0    ; sc_ViewPort+vp_ColorMap: in a0 ora abbiamo
  199.                 ; la struttura ColorMap dell schermo, che ci
  200.                 ; serve (in a0) per eseguire un "video_control"
  201.                 ; della graphics.library.
  202.     LEA    GETVidCtrlTags(PC),A1    ; In a1 la TagList per la routine
  203.                     ; "Video_control" - la richiesta che
  204.                     ; facciamo a questa routine e' di
  205.                     ; VTAG_SPRITERESN_GET, ossia di sapere
  206.                     ; la risoluzione attuale degli sprite.
  207.     MOVE.L    GfxBase(PC),A6
  208.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  209.                 ; riporta nella taglist, nella long
  210.                 ; "risoluzione", la risoluzione attuale degli
  211.                 ; sprite in quello schermo.
  212.  
  213. ; Ora salviamo la risoluzione anche dell'eventuale schermo "in primo piano",
  214. ; ad esempio la schermata dell'assemblatore:
  215.  
  216.     MOVE.L    IntuiBase(PC),A6
  217.     move.l    $3c(a6),a0    ; Ib_FirstScreen (Schermo in "primo piano!")
  218.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  219.     LEA    GETVidCtrlTags2(PC),A1    ; In a1 la TagList GET
  220.     MOVE.L    GfxBase(PC),A6
  221.     JSR    -$2C4(A6)    ; Video_Control (in a0 la cm e in a1 i tags)
  222.  
  223. ; Ora chiediamo alla routine VideoControl di settare la risoluzione.
  224. ; SPRITERESN_140NS -> ossia lowres!
  225.  
  226.     MOVE.L    SchermoWBLocckato(PC),A0
  227.     MOVE.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  228.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  229.     MOVE.L    GfxBase(PC),A6
  230.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  231.  
  232.     move.L    IntuiBase(PC),A6
  233.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  234.                 ; primo piano (ad es. ASMONE)
  235.     move.L    $30(A0),A0    ; struttura sc_ViewPort+vp_ColorMap in a0
  236.     LEA    SETVidCtrlTags(PC),A1    ; TagList che resetta gli sprite.
  237.     move.L    GfxBase(PC),A6
  238.     JSR    -$2C4(A6)    ; video_control... resetta gli sprite!
  239.  
  240.     move.L    SchermoWBLocckato(PC),A0
  241.     move.L    IntuiBase(PC),A6
  242.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  243.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  244.                 ; primo piano (ad es. ASMONE)
  245.     JSR    -$17A(A6)    ; _LVOMakeScreen - occorre rifare lo schermo
  246.                 ; per essere sicuri del reset: ossia occorre
  247.                 ; chiamare MakeScreen, seguito da...
  248.     JSR    -$186(A6)    ; _LVORethinkDisplay - che ridisegna tutto il
  249.                 ; display, comprese ViewPorts e eventuali
  250. ErroreSchermo:            ; modi interlace o multisync.
  251.     RTS
  252.  
  253. ; Ora dobbiamo risettare gli sprites alla risoluzione di partenza.
  254.  
  255. RimettiSprites:
  256.     MOVE.L    SchermoWBLocckato(PC),D0 ; Indirizzo strutt. Screen
  257.     BEQ.S    NonAvevaFunzionato     ; Se = 0, allora peccato...
  258.     MOVE.L    D0,A0
  259.     MOVE.L    OldRisoluzione(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  260.     LEA    SETOldVidCtrlTags(PC),A1
  261.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  262.     MOVE.L    GfxBase(PC),A6
  263.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  264.  
  265. ; Ora dello schermo in primo piano (eventuale)...
  266.  
  267.     MOVE.L    IntuiBase(PC),A6
  268.     move.l    $3c(a6),a0    ; Ib_FirstScreen - "pesca" lo schermo in
  269.                 ; primo piano (ad es. ASMONE)
  270.     MOVE.L    OldRisoluzioneP(PC),OldRisoluzione2 ; Rimetti vecchia risoluz.
  271.     LEA    SETOldVidCtrlTags(PC),A1
  272.     MOVE.L    $30(A0),A0    ; Struttura ColorMap dello screen
  273.     MOVE.L    GfxBase(PC),A6
  274.     JSR    -$2C4(A6)    ; _LVOVideoControl - Risetta la risoluzione
  275.  
  276.     move.L    IntuiBase(PC),A6
  277.     move.L    SchermoWBLocckato(PC),A0
  278.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  279.     move.l    $3c(a6),a0    ; Ib_FirstScreen - schermo in primo piano
  280.     JSR    -$17A(A6)    ; RethinkDisplay - "ripensiamo" il display
  281.     MOVE.L    SchermoWBLocckato(PC),A1
  282.     SUB.L    A0,A0        ; null
  283.     move.L    IntuiBase(PC),A6
  284.     JSR    -$204(A6)    ; _LVOUnlockPubScreen - e "sblocchiamo" lo
  285. NonAvevaFunzionato:        ; screen del workbench.
  286.     RTS
  287.  
  288. SchermoWBLocckato:
  289.     dc.l    0
  290.  
  291. ; Questa e' la struttura per usare Video_Control. La prima long serve per
  292. ; CAMBIARE (SET) la risoluzione degli sprite o per sapere (GET) quella vecchia.
  293.  
  294. GETVidCtrlTags:
  295.     dc.l    $80000032    ; GET
  296. OldRisoluzione:
  297.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  298.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  299.  
  300. GETVidCtrlTags2:
  301.     dc.l    $80000032    ; GET
  302. OldRisoluzioneP:
  303.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  304.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  305.  
  306. SETVidCtrlTags:
  307.     dc.l    $80000031    ; SET
  308.     dc.l    1    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  309.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  310.  
  311. SETOldVidCtrlTags:
  312.     dc.l    $80000031    ; SET
  313. OldRisoluzione2:
  314.     dc.l    0    ; Risoluzione sprite: 0=ECS, 1=lowres, 2=hires, 3=shres
  315.     dc.l    0,0,0    ; 3 zeri per TAG_DONE (terminare la TagList)
  316.  
  317. ; Nome schermo del WorkBench
  318.  
  319. Workbench:
  320.     dc.b    'Workbench',0
  321.  
  322. ; *****************************************************************************
  323. ; QUESTA ROUTINE BLOCCA INTUITION CREANDO UNA MESSAGE-PORT AD UN LIVELLO
  324. ; DI PRIORITA' PIU' ALTO DI QUELLO DI INTUITION, COSICCHE' TUTTI I MESSAGGI
  325. ; RELATIVI AD INTUITION VENGONO INVIATI A QUESTA MESSAGE-PORT (NULLAFACENTE).
  326. ; *****************************************************************************
  327.  
  328. InputOFF:
  329.     LEA    INPUTMPORT(PC),A1    ; port da creare
  330.     BSR.w    CREATEPORT
  331.     CMP.L    #-1,D0
  332.     BEQ.w    INTUIERROR
  333.     MOVE.L    #INPUTMPORT,inputioST    ; MN_REPLYPORT+inputio
  334.     LEA    INPUTDEVICE(PC),A0    ; DevName: input.device
  335.     MOVEQ    #0,D0            ; Unit Number
  336.     LEA    INPUTIO(PC),A1        ; iORequest block da inizializzare
  337.     MOVEQ    #0,D1            ; flags: nessuno
  338.     MOVE.L    4.w,A6
  339.     JSR    -$1BC(A6)        ; OpenDevice - inizializza inputio
  340.     TST.L    D0            ; Se d0=0 nessun errore
  341.     BNE.S    INTUITIONON1        ; Altrimenti esci disperato
  342.  
  343. ; Ora occorre che il nostro input handler abbia priorita' maggiore di
  344. ; intuition, che ha priorita' 50. Basta mettere priorita' 51!
  345.  
  346.     MOVE.B    #51,LN_PRI       ; Priorita' nostro inputhandler = 51
  347.     CLR.L    IS_DATA           ; IS_DATA dell'inputhandler = 0
  348.     MOVE.L    #READINPUT,IS_CODE ; Come codice solo moveq #0,d0 & rts.
  349.     MOVE.W    #9,IO_COMMAND       ; comando: ND_ADDHANDLER
  350.     MOVE.L    #INPUTHANDLER,IO_DATA
  351.     LEA    INPUTIO(PC),A1    ; iOrequest
  352.     MOVE.L    4.w,A6
  353.     JSR    -$1C8(A6)    ; DoIo
  354.     RTS
  355.  
  356. ; Routine che mettiamo nel nostro input handler... non fa molto, eh!?
  357.  
  358. READINPUT:
  359.     MOVEQ    #0,D0        ; non passiamo input a Intuition
  360.     RTS
  361.  
  362. ; *****************************************************************************
  363. ; Routine che ripristina l'input/output di intuition
  364. ; *****************************************************************************
  365.  
  366. InputON:
  367.     TST.B    InputErrFlag    ; errore in InputOFF?
  368.     BNE.S    EsciInputON    ; se si, niente da fare qua
  369.     MOVE.W    #10,IO_COMMAND    ; comando: IND_REMHANDLER (rimuovi handler)
  370.     MOVE.L    #INPUTHANDLER,IO_DATA
  371.     LEA    INPUTIO(PC),A1    ; iORequest
  372.     MOVE.L    4.w,A6
  373.     JSR    -$1C8(A6)    ; DoIo
  374.     LEA    INPUTIO(PC),A1    ; iORequest
  375.     MOVE.L    4.w,A6
  376.     JSR    -$1C2(A6)    ; CloseDevice
  377. INTUITIONON1:
  378.     LEA    INPUTMPORT(PC),A1
  379.     BSR.s    FREEUPPORT
  380. INTUIERROR:
  381.     MOVE.B    #$FF,InputErrFlag    ; segna l'errore
  382. EsciInputON:
  383.     RTS
  384.  
  385. InputErrFlag:
  386.     dc.w    0
  387.  
  388. ; a1=address of port. In uscita se d0=-1 allora c'e' un errore
  389.  
  390. CREATEPORT:
  391.     MOVE.L    A1,-(SP)
  392.     MOVEQ    #-1,D0        ; SignalNum -1 (uno qualsiasi)
  393.     MOVE.L    4.w,A6
  394.     JSR    -$14A(A6)    ; AllocSignal
  395.     MOVEQ    #-1,D1
  396.     CMP.L    D1,D0        ; Errore?
  397.     BEQ.S    FREEUPPORT1
  398.     MOVE.L    (SP),A0        ; Port in a0
  399.     MOVE.B    #0,9(A0)    ; LN_PRI
  400.     MOVE.B    #4,8(A0)    ; NT_MSGPORT, LN_TYPE
  401.     MOVE.B    #0,14(A0)    ; PA_SIGNAL, MP_FLAGS
  402.     MOVE.B    D0,15(A0)    ; MP_SIGBIT
  403.     SUBA.L    A1,A1
  404.     MOVE.L    4.w,A6
  405.     JSR    -$126(A6)    ; FindTask (trova questo task)
  406.     MOVE.L    (SP),A1
  407.     MOVE.L    D0,$10(A1)    ; d0,MP_SIGTASK
  408.     LEA    $14(A1),A0    ; MP_MSGLIST,a0
  409.     MOVE.L    A0,(A0)        ; NEWLIST a0
  410.     ADDQ.L    #4,(A0)        ; 
  411.     CLR.L    4(A0)        ; 
  412.     MOVE.L    A0,8(A0)    ;
  413. CREATEPORTEXIT:
  414.     MOVE.L    (SP)+,D0
  415.     RTS
  416.  
  417. ; a1=address of port
  418.  
  419. FREEUPPORT:
  420.     MOVE.L    A1,-(SP)
  421.     MOVE.B    15(A1),D0    ; MP_SIGBIT,d0 (SignalNum)
  422.     MOVE.L    4.w,A6
  423.     JSR    -$150(A6)    ; FreeSignal
  424. FREEUPPORT1:
  425.     MOVE.L    (SP)+,A1
  426.     RTS
  427.  
  428. INPUTMPORT:
  429.     ds.b    34    ; MP_SIZE
  430.  
  431. INPUTIO:
  432.     ds.b    14
  433. inputioST:
  434.     ds.b    14
  435. IO_COMMAND:
  436.     ds.b    12
  437. IO_DATA:
  438.     ds.b    8
  439.  
  440. INPUTHANDLER:
  441.     ds.b    9
  442. LN_PRI:
  443.     ds.b    5
  444. IS_DATA:
  445.     dc.l    0
  446. IS_CODE:
  447.     dc.l    0
  448.  
  449. INPUTDEVICE:
  450.     dc.b    'input.device',0,0
  451.  
  452. ******************************************************************************
  453. ;    Da qua in avanti si puo' operare sull'hardware in modo diretto
  454. ******************************************************************************
  455.  
  456. HEAVYINIT:
  457.     LEA    $DFF000,A5        ; Base dei registri CUSTOM per Offsets
  458.     MOVE.W    $2(A5),OLDDMA        ; Salva il vecchio status di DMACON
  459.     MOVE.W    $1C(A5),OLDINTENA    ; Salva il vecchio status di INTENA
  460.     MOVE.W    $10(A5),OLDADKCON    ; Salva il vecchio status di ADKCON
  461.     MOVE.W    $1E(A5),OLDINTREQ    ; Salva il vecchio status di INTREQ
  462.     MOVE.L    #$80008000,d0        ; Prepara la maschera dei bit alti
  463.                     ; da settare nelle word dove sono
  464.                     ; stati salvati i registri
  465.     OR.L    d0,OLDDMA    ; Setta il bit 15 di tutti i valori salvati
  466.     OR.L    d0,OLDADKCON    ; dei registri hardware, indispensabile per
  467.                 ; rimettere tali valori nei registri.
  468.  
  469.     MOVE.L    #$7FFF7FFF,$9A(a5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  470.     MOVE.L    #0,$144(A5)        ; SPR0DAT - ammazza il puntatore!
  471.     MOVE.W    #$7FFF,$96(a5)        ; DISABILITA I DMA
  472.     MOVE.L    #0,$144(A5)
  473.  
  474.     move.l    4.w,a6        ; ExecBase in a6
  475.     btst.b    #0,$129(a6)    ; Testa se siamo su un 68010 o superiore
  476.     beq.s    IntOK        ; E' un 68000! Allora la base e' sempre zero.
  477.     lea    SuperCode(PC),a5 ; Routine da eseguire in supervisor
  478.     jsr    -$1e(a6)    ; LvoSupervisor - esegui la routine
  479.     bra.s    IntOK        ; Abbiamo il valore del VBR, continuiamo...
  480.  
  481. ;**********************CODICE IN SUPERVISORE per 68010+ **********************
  482. SuperCode:
  483.     dc.l      $4e7a9801    ; Movec Vbr,A1 (istruzione 68010+).
  484.                 ; E' in esadecimale perche' non tutti gli
  485.                 ; assemblatori assemblano il movec.
  486.     move.l    a1,BaseVBR    ; Label dove salvare il valore del VBR
  487.     RTE            ; Ritorna dalla eccezione
  488. ;*****************************************************************************
  489.  
  490. BaseVBR:        ; Se non modificato, rimane zero! (per 68000).
  491.     dc.l    0
  492.  
  493. IntOK:
  494.     move.l    BaseVBR(PC),a0     ; In a0 il valore del VBR
  495.     move.l    $64(a0),OldInt64 ; Sys int liv 1 salvato (softint,dskblk)
  496.     move.l    $68(a0),OldInt68 ; Sys int liv 2 salvato (I/O,ciaa,int2)
  497.     move.l    $6c(a0),OldInt6c ; Sys int liv 3 salvato (coper,vblanc,blit)
  498.     move.l    $70(a0),OldInt70 ; Sys int liv 4 salvato (audio)
  499.     move.l    $74(a0),OldInt74 ; Sys int liv 5 salvato (rbf,dsksync)
  500.     move.l    $78(a0),OldInt78 ; Sys int liv 6 salvato (exter,ciab,inten)
  501.  
  502.     bsr.w    ClearMyCache
  503.  
  504.     lea    $dff000,a5    ; Custom register in a5
  505.     bsr.w    START        ; Esegui il programma.
  506.  
  507.     bsr.w    ClearMyCache
  508.  
  509.     LEA    $dff000,a5    ; Custom base per offsets
  510.     MOVE.W    #$8240,$96(a5)    ; dmacon - abilita blit
  511.     BTST.b    #6,2(a5)    ; WaitBlit via hardware...
  512. Wblittez:
  513.     BTST.b    #6,2(a5)
  514.     BNE.S    Wblittez
  515.  
  516.     MOVE.W    #$7FFF,$96(A5)        ; DISABILITA TUTTI I DMA
  517.     MOVE.L    #$7FFF7FFF,$9A(A5)    ; DISABILITA GLI INTERRUPTS & INTREQS
  518.     MOVE.W    #$7fff,$9E(a5)        ; Disabilita i bit di ADKCON
  519.  
  520.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  521.     move.l    OldInt64(PC),$64(a0) ; Sys int liv1 salvato (softint,dskblk)
  522.     move.l    OldInt68(PC),$68(a0) ; Sys int liv2 salvato (I/O,ciaa,int2)
  523.     move.l    OldInt6c(PC),$6c(a0) ; Sys int liv3 salvato (coper,vblanc,blit)
  524.     move.l    OldInt70(PC),$70(a0) ; Sys int liv4 salvato (audio)
  525.     move.l    OldInt74(PC),$74(a0) ; Sys int liv5 salvato (rbf,dsksync)
  526.     move.l    OldInt78(PC),$78(a0) ; Sys int liv6 salvato (exter,ciab,inten)
  527.  
  528.     MOVE.W    OLDADKCON(PC),$9E(A5)    ; ADKCON
  529.     MOVE.W    OLDDMA(PC),$96(A5)    ; Rimetti il vecchio status DMA
  530.     MOVE.W    OLDINTENA(PC),$9A(A5)    ; INTENA STATUS
  531.     MOVE.W    OLDINTREQ(PC),$9C(A5)    ; INTREQ
  532.     RTS
  533.  
  534. ;    Dati salvati dalla startup
  535.  
  536. WBVIEW:            ; Indirizzo del View del WorkBench
  537.     DC.L    0
  538. GfxName:
  539.     dc.b    'graphics.library',0,0
  540. IntuiName:
  541.     dc.b    'intuition.library',0
  542. DosName:
  543.     dc.b    "dos.library",0
  544. GfxBase:        ; Puntatore alla Base della Graphics Library
  545.     dc.l    0
  546. IntuiBase:        ; Puntatore alla Base della Intuition Library
  547.     dc.l    0
  548. DosBase:        ; Puntatore alla Base della Dos Library
  549.     dc.l    0
  550. OLDDMA:            ; Vecchio status DMACON
  551.     dc.w    0
  552. OLDINTENA:        ; Vecchio status INTENA
  553.     dc.w    0
  554. OLDADKCON:        ; Vecchio status ADKCON
  555.     DC.W    0
  556. OLDINTREQ:        ; Vecchio status INTREQ
  557.     DC.W    0
  558.  
  559. ; Vecchi interrupt di sistema
  560.  
  561. OldInt64:
  562.     dc.l    0
  563. OldInt68:
  564.     dc.l    0
  565. OldInt6c:
  566.     dc.l    0
  567. OldInt70:
  568.     dc.l    0
  569. OldInt74:
  570.     dc.l    0
  571. OldInt78:
  572.     dc.l    0
  573.  
  574. ; Routine da chiamare in caso di codice automodificante, modifica di tabelle
  575. ; in fast ram, caricamento da disco, ecc.
  576.  
  577. ClearMyCache:
  578.     movem.l    d0-d7/a0-a6,-(SP)
  579.     move.l    4.w,a6
  580.     MOVE.W    $14(A6),D0    ; lib version
  581.     CMP.W    #37,D0        ; e' V37+? (kick 2.0+)
  582.     blo.s    nocaches    ; Se kick1.3, il problema e' che non puo'
  583.                 ; nemmeno sapere se e' un 68040, per cui
  584.                 ; e' rischioso.. e si spera che uno
  585.                 ; stupido che ha un 68020+ su un kick1.3
  586.                 ; abbia anche le caches disabilitate!
  587.     jsr    -$27c(a6)    ; cache cleaR U (per load, modifiche ecc.)
  588. nocaches:
  589.     movem.l    (sp)+,d0-d7/a0-a6
  590.     rts
  591.  
  592.